головне меню список тем тестування презентації історія створення

 

5.3. Система команд мікроконтролерів підгрупи PIC16F8X

5.3.1. Перелік і формати команд

Мікроконтролери підгрупи PIC16F8X мають просту і ефективну систему команд, що складається всього з 35 команд.
Кожна команда МК підгрупи PIC16F8X є 14-бітовим словом, розділеним на код операції (OPCODE), і полем для одного і більше операндів, які можуть брати участь або не брати участь в цій команді. Система команд PIC16F8X є ортогональною і включає команди роботи з байтами, команди роботи з бітами і операції з константами і команди управління. В таблиці 5.10  приведені описи полів команд.
Таблиця 5.10. Описи полів команд МК сімейства PIC16CXXX.          


Поле

Опис

f

Адреса регістра

w

Робочий регістр

b

Номер біта в 8-розрядному регістрі

к

 Константа

x

Не використовується. Асемблер формує код з x=0

d

Регістр призначення:

d=0 - результат в регістрі w

d=1 - результат в регістрі f

За умовчанням d=1

label

Ім'я мітки

TOS

Beршина стека

PC

Лічильник команд

PCLATH

Регістр PCLATH

GIE

Біт дозволу всіх переривань

WDT

Сторожовий таймер

/TO

 Тайм-аут

/PD

 Виключення живлення

dest

Регістр призначення: робочий регістр w або регістр, заданий в команді

[ ]

необов'язкові параметри

( )

Зміст

>

Привласнення

< >

Поле номера біта

?

З набору

                                                                                                                                             
Для команд роботи з байтами f позначає регістр, з яким проводиться дія; d - біт, що визначає, куди помістити результат. Якщо d =0, то результат буде поміщений в регістр w, при d=1 результат буде поміщений в регістр «f», згаданий в команді.
Для команд роботи з бітами b позначає номер біта, що бере участь в команді, а f - це регістр, в якому даний біт розташований.
Для команд передачі управління і операцій з константами, k позначає восьми- або одиннадцатибітну константу.
Майже всі команди виконуються протягом одного командного циклу. В двох випадках виконання команди займає два командні цикли:

  • перевірка умови і перехід;
  • зміна програмного лічильника як результат виконання команди.

Один командний цикл складається з чотирьох періодів генератора. Таким чином, для генератора з частотою 4 Мгц час виконання командного циклу буде 1 мкс.
Основні формати команд МК зображені на мал. 5.15.

Система команд МК підгрупи PIC16F8X приведена в табл. 5.11.




Мал. 5.15. Основні формати команд.

 Таблиця 5.11. Система команд МК підгрупи PIC16F8X.                     


Мнемоніка

Опис команди

Цикли

Біти стану

Прим.

ADDWF f, d

Додавання W с f

1

C ,DC ,Z

1, 2

ANDWF f, d

Логічне І W и f

1

Z

1, 2

CLRF f

Скид регістра  f

1

Z

2

CLRW

Скид регістра  W

1

Z

 

COMF f, d

Інверсія регістру f

1

Z

1, 2

DECF f, d

Декремент регістру f

1

Z

1, 2

DECFSZ f, d

Декремент f, пропустити команду, якщо 0

1(2)

 

1, 2, 3

INCF f, d

Інкремент регістру f

1

Z

1, 2

INCFSZ f, d

інкремент  f, пропустити команду, якщо 0

1(2)

 

1, 2, 3

IORWF f, d

Логічне АБО W и f

1

Z

1, 2

MOVF f, d

Пересилка регістру f

1

Z

1, 2

MOVWF f

пересилка W в f

1

 

 

NOP -

Холоста команда

1

 

 

RLF f, d

Зсув f вліво через перенос

1

C

1, 2

RRF f, d

Зсув f вправо через перенос

1

C

1, 2

SUBWF f, d

Віднімання W из f

1

C,DC,Z

1, 2

SWAPF f, d

Обмін місцями тетрад в f

1

 

1, 2

XORWF f, d

Виключне АБОW и f

1

Z

1, 2

 

BCF f, b

Скид біту в регістре f

1

 

1, 2

BSF f, b

Встановлення біту в регістрі f

1

 

1, 2

BTFSC f, b

Пропустити команду, якщо біт в f рівний нулю

1(2)

 

3

BTFSS f, b

Пропустити команду, якщо біт в f рівний одиниці

1(2)

 

3

 

ADDLW k

Додавання константи  і W

1

C, DC, Z

 

ANDLW k

Логічне множення константи і  W

1

Z

 

CALL k

Визов програми

2

 

 

CLRWDT -

Скид сторожового таймеру WDT

1

/TO, /P

 

GOTO k

Перехід на адресу

2

 

 

IORLW k

Логічне додавання константи і  W

1

Z

 

MOVLW k

Пересилка константи  в W

1

 

 

RETFIE -

Повернення з переривання

2

 

 

RETLW k

Повернення з підпрограми з завантаженням константи вW

2

 

 

RETURN -

Повернення з підпрограми

2

 

 

SLEEP -

Перехід в режим SLEEP

1

/TO, /P

 

SUBLW k

Віднімання  W из константи

1

C, DC, Z

 

XORLW k

Виключне або константи і  W

1

Z

 

 

Примітки до таблиці:  Якщо модифікується регістр вводу/виводу, то використовується значення, прочитуване з висновків. Наприклад, якщо у вихідній клямці порту, включеного на введення, знаходиться «1», а зовнішній пристрій формує на цьому виводу «0», то в розряді даних буде записаний «0».  Якщо операндом команди є вміст регістра TMRO (і, якщо допустимо, d=1), то попередній дільник, якщо він підключений до TMRO, буде скинений.  Якщо в результаті виконання команди змінюється лічильник команд або виконується перехід по перевірці умови, то команда виконується за два цикли. Другий цикл виконується як NOP.

5.3.2. Команди роботи з байтами

Команди роботи з байтами використовуються в PIC МК для пересилки даних між регістрами і виконання математичних операцій над їх вмістом. Не дивлячись на відносно невеликий набір команд, вони дозволяють реалізувати цілий ряд операцій. Це зв'язано, зокрема, з можливістю вказати в команді адресу розміщення результату операції.
Перевагою системи команд є також можливість використовування різних способів звернення до регістрів. Адреса регістра може бути вказана безпосередньо в команді відповідним 7-бітовим полем f. При цьому доступ можливий тільки до даних, розташованих в межах поточного банку даних. Адресація даних може здійснюватися і за допомогою індексного регістра FSR, шляхом звернення до регістра непрямої адресації INDF, розташованого за нульовою адресою.
Пересилка даних виконується за допомогою двох команд: MOVF і MOVWF, призначення яких істотно розрізняється. Команда MOVF використовується для установки біта нульового результату залежно від вмісту певного регістра і може застосовуватися для його завантаження в регістр w. Команда MOVWF використовується для запису вмісту робочого регістра w у вказаний регістр МК. Якщо цей регістр указується як  INDF, то адреса регістра призначення вибирається з регістра FSR. При виконанні даної команди біти стану не змінюються.
Спеціальні команди CLRF f і CLRW застосовуються для очищення регістрів МК. Команда CLRF f записує нуль у вказаний регістр, а команда CLRW - в робочий регістр. При цьому необхідно пам'ятати, що вони також встановлюють відповідне значення біта нуля.
Арифметичною операцією, що часто використовується, є додавання, яке виконується командою ADDWF f,d. Ця операція може змінювати всі біти стану. Біт нуля встановлюється в 1, якщо при виконанні логічної операції «І» над одержаним результатом і числом 0x0FF (255) виходить нуль. Біт перенесення встановлюється в 1, якщо результат перевищує число 0x0FF. Біт десяткового перенесення встановлюється в 1, якщо сума чотирьох молодших бітів результату перевищує 0x0F (15).
При використовуванні операції віднімання SUBWF f, d слід мати на увазі, що в PIC МК вона виконує операцію додавання з негативним числом. Тобто замість операції d = f - w насправді виконується d = f + (-w). Негативне значення вмісту w обчислюється по формулі Negw = (Posw ^ 0x0FF) + 1.
Команди логічних операцій ANDWF f, d, IORWF f, d і XORWF f, d дозволяють виконувати основні логічні операції над відповідними бітами вмісту вказаного регістра і регістра w. Біт нуля в регістрі STATUS встановлюється в 1 або скидається в 0 залежно від значення одержаного результату. Команду XORWF f, d зручно використовувати для перевірки вмісту деякого регістра. Для цього необхідно завантажити задане число в регістр w і виконати операцію XORWF f, d над вмістом регістра, що перевіряється, і w. Якщо вміст регістра рівний вмісту w, то результат операції буде рівний нулю, і біт нуля встановиться в 1.
Команда COMF f, d використовується для інвертування значень всіх бітів в регістрі джерела. Слід зазначити, що ця команда не робить число негативним, тобто не переводить його в додатковий код. Негативне число Neg може бути одержано з позитивного Pos таким чином: Neg = (Pos ^ 0x0FF) + 1.
Команда SWAPF f, d міняє місцями тетради в регістрі. Як і в решті команд даної групи, результат виконання може бути записаний як в регістрі w, так і в регістрі-джерелі. Дана команда не міняє значення якогось з бітів стану, що може використовуватися для відновлення вмісту контекстних регістрів перед поверненням з переривання. Команду SWAPF f, d можна застосовувати, зокрема, для зберігання двох цифр в одному регістрі, переставляючи їх залежно від того, яку з них ви хочете використовувати. За допомогою команди SWAPF f, d зручно розділити байт на дві тетради для їх подальшого відображення на дисплеї.
Основною функцією команд циклічного зсуву RLF f, d і RRF f, d є зсув вмісту регістра вліво або управо на один біт із записом на місце молодшого значущого біта значення біта перенесення або, відповідно, встановлення біта перенесення відповідно до значення старшого значущого біта. Команди циклічного зсуву можуть використовуватися для множення і поділу на число 2 в ступені n. Вони також служать для реалізації послідовного вводу/виводу даних і позиціонування байта для того, щоб можна було тестувати значення окремих бітів.
Команди інкремента INCF f, d і декремента DECF f, d використовуються для зміни вмісту регістра на 1. Після виконання команд інкремента і декремента може змінитися тільки біт нуля. Зміни біта перенесення, якщо результат перевищить значення 0x0FF при інкременті або виявиться менше 0 при декременті, не відбувається.
Для реалізації умовних переходів в програмі існують команди інкремента і декремента з пропуском команди при нульовому результаті: INCFSZ f, d і DECFSZ f, d. З погляду обробки даних вони працюють аналогічно командам INCF f, d і DECF f, d. Основна відмінність від цих команд полягає в тому, що при нульовому результаті виконання команди INCFSZ f, d або DECFSZ f, d пропускається наступна за нею команда. Це означає, що команди INCFSZ f, d і DECFSZ f, d можуть використовуватися для організації програмних циклів. Інша особливість цих команд полягає в тому, що вони не впливають на вміст бітів стану регістра STATUS.

Команда NOP означає відсутність операції. Традиційно вона використовується для двох цілей. Перша - забезпечення синхронізації програми з тимчасовими характеристиками різних пристроїв системи. Другим можливим варіантом є використовування команди NOP для видалення частини програмного коду. Унаслідок того, що код команди NOP складається з одних нулів, його легко ввести в пам'ять програм замість будь-якої іншої команди, не вдаючись до стирання і репрограмування всієї пам'яті програм.

5.3.3. Команди роботи з бітами

Відмітною особливістю даної групи команд є те, що вони оперують з однобітовими операндами, як такі використовуються окремі біти регістрів МК.
Установка і скидання окремих бітів проводиться командами BSF f, b і BCF f, b. Будь-який доступний для запису біт в регістровій пам'яті може бути модифікований у такий спосіб. При цьому гарантується, що жоден з решти бітів регістра не буде змінений.
Проте при роботі з портами вводу/виводу останнє твердження не завжди справедливе. Зв'язано це з тим, що значення числа, прочитуваного з регістра порту, залежить від конфігурації його виводів  як входи або виходи даних.
В системі команд, даних PIC МК, відсутні команди умовного переходу. Замість них є такі, які дозволяють пропустити виконання наступної команди. Зокрема, розглянуті вище команди INCFSZ f, d і DECFSZ f, d зручні для організації циклів в програмі.
Для управління процесом виконання програми використовуються команди роботи з бітами BTFSC f, b і BTFSS f, b, дозволяючі пропустити виконання наступної команди програми залежно від стану певного біта в заданому регістрі.
Якщо як заданий регістр використовується регістр STATUS, то можна організувати управління переходами програми залежно від стану бітів ознак результату операції, як передбачено в мікропроцесорах стандартної архітектури.


5.3.4. Команди управління і роботи з константами

Команди роботи з константами використовують явно задані операнди, які є частиною команди.
Команда MOVLW k використовується для запису константи k в робочий регістр w. Вміст регістра STATUS при цьому не змінюється.
Команда ADDLW k додає безпосередньо задану величину до вмісту регістра w. Ця команда змінює значення бітів нуля, перенесення і десяткового перенесення таким же чином, як і команда ADDWF f, d.
Команда SUBLW k віднімає вміст регістра w із заданого значення константи k. На відміну від SUBWF f, d, результат виконання команди SUBLW k можна представити в наступному вигляді: w = до + (w ^ 0x0FF) + 1. За допомогою цієї команди зручно змінювати знак вмісту регістра w, використовуючи її таким чином: SUBLW 0.
Команди логічних операцій ANDLW k, IORLW k і XORLW k виконують побітово відповідні операції над вмістом регістра w і безпосередньо заданою константою k. Ці команди, як і команди роботи з байтами, встановлюють тільки біт нуля в регістрі STATUS відповідно до результату операції. Одержаний результат зберігається в регістрі w.
За допомогою команди IORLW 0 зручно визначати рівність нулю вмісту регістра w. Залежно від результату цієї операції біт нуля буде встановлений в 1 або скинений в 0.
Команда RETLW k використовується для повернення з підпрограми з установкою початкових умов в регістр w, а також для реалізації табличних перетворень, що буде описане нижче. Перед поверненням з підпрограми ця команда здійснює завантаження безпосередньо заданої величини в робочий регістр w.
Команди GOTO k, CALL k, RETURN і RETFIE використовуються для управління програмою.
Команди GOTO k і CALL k можуть явно задавати адресу переходу в межах певної сторінки, розмір якої залежить від типа МК: 256/512 адрес для молодших моделей, 2К адрес для PIC МК середнього рівня (включаючи PIC16F8X) і 8К адрес для старших моделей МК. Якщо адреса переходу виходить за межі сторінки, то регістр PCLATH повинен містити правильну інформацію про нову сторінку.
Команда CALL k виконується практично так само, як і GOTO k, за винятком того, що покажчик на наступну сторінку зберігається в стеку лічильника команд.
Для PIC МК середньої групи існує три різні способи повернення з підпрограми, визначувані командами RETLW k, RETURN і RETFIE. При кожному з цих способів значення адреси витягується з вершини стека і завантажується в лічильник команд. Ці адреси використовуються для повернення з підпрограм або переривань.
Звичайне використовування команди RETURN приводить до відновлення адреси команди, наступної за командою виклику підпрограми. При цьому вміст яких-небудь регістрів не змінюється, як і значення окремих бітів.
Команда RETFIE використовується для повернення з переривання. Вона реалізується аналогічно команді RETURN за винятком того, що при її виконанні встановлюється в 1 біт GIE в регістрі управління перериваннями INTCON. Це дозволяє після виконання даної команди негайно перейти до обробки переривань, чекаючих своєї черги. Інакше перед закінченням обробки було б потрібно перевірка наявності запитів інших переривань, і, у разі їх надходження, перехід до їх обробки.
Існує всього дві команди, що служать для безпосереднього управління функціонуванням МК. Перша з них - CLRWDT - використовується для скидання  сторожового таймера. Друга - SLEEP - забезпечує збереження поточного стану МК в режимі очікування, поки не відбудеться яка-небудь зовнішня подія, яка дозволить PIC МК продовжити виконання програми.
Команда CLRWDT скидає в 0 вміст сторожового таймера  WDT і попереднього подільника (якщо він використовується для установки інтервалу часу спрацьовування WDT), запускаючи спочатку відлік часу сторожового таймера. Метою введення команди CLRWDT є запобігання перезапуску МК при нормальному виконанні програми.
Команда SLEEP служить для двох цілей. Першим з них є відключення МК після того, як він закінчить виконання програми. Таке використовування МК припускає, що він необхідний тільки для вирішення певної задачі, наприклад, ініціалізації інших пристроїв в системі, а потім його функціонування не потрібне.
Другою метою використовування команди SLEEP є реалізація в МК режиму очікування якої-небудь події. Існує три події, здатні вивести МК з режиму очікування. Першою з них є подача сигналу запуску на вхід скидання МК, що приведе до перезапуску процесора і початку виконання програми з нульової адреси. Другий спосіб - надходження сигналу «пробудження» МК від сторожового таймера. Третім способом «пробудження» є переривання від якого-небудь зовнішнього джерела. При будь-якому способі «пробудження» використовування команди SLEEP дозволяє уникнути необхідності організації циклів очікування, а також понизити споживану системою потужність.

При цьому необхідно мати на увазі, що вихід МК з режиму очікування займає, щонайменше, 1024 такти. Тому команду SLEEP не можна використовувати в тих випадках, коли потрібна швидка реакція на зовнішню подію.

5.3.5. Особливості програмування і відладки

Аналіз архітектури мікроконтролерів PIC з погляду їх програмування і відладки систем дозволяє зробити наступні висновки:
RISC-система команд забезпечує високу швидкість виконання інструкцій, але викликає утруднення і зниження продуктивності при програмуванні нетривіальних алгоритмів. Оскільки всі інструкції в системі команд є одноадресними, завантаження константи в будь-якій з регістрів вимагає двох інструкцій. Спочатку потрібно завантажити константу в робочий регістр w, а потім переслати його вміст в потрібний елемент пам'яті даних:
movlw  k
movwf f
Аналогічно, всі бінарні арифметико-логічні операції доводиться виконувати із залученням робочого регістра w;

  • висока швидкодія досягається в значній мірі за рахунок вживання конвейєра команд. Інструкції розгалуження, що змінюють лічильник команд (безумовний перехід, обчислюваний перехід), не використовують інструкцію з черги, тому виконуються за два машинні цикли і знижують темп виконання програми. Крім того, сам аналіз умов в архітектурі PIC вимагає виконання «зайвих» команд;
  • наявність одного вектора переривань, відсутність розвиненого механізму обробки запитів по пріоритетах і вкладених переривань утрудняють рішення трохи складніших  задач управління. При приході запиту від будь-якого з джерел виконується перехід на процедуру обробки по єдиному вектору. В процедурі доводиться по бітах ознак визначати джерело, причому умови галуження, як вказувалося вище, аналізуються складно, і все це збільшує час реакції. Після обробки переривання потрібно самостійно очистити біт запиту. Через відсутність вкладених переривань можливе тривале очікування обробки запитом від джерела з більш високим пріоритетом;
  • апаратний стек глибиною 8 слів не має ознаки переповнювання і обмежує вкладеність процедур. За тим, щоб він не переповнювався, програміст повинен стежити самостійно;
  • пам'ять даних складається з банків, для визначення поточного банку використовуються біти регістрів STATUS (для PIC16) або BSR (для PIC17). На етапі трансляції приналежність вказаного регістра поточному активному банку перевірити неможливо, для цього потрібне моделювання ходу виконання програми;
  • пам'ять програм розбита на сторінки розміром 2К слів. Для переходу на потрібну адресу по командах CALL і GOTO повинні бути правильно встановлені біти вибору поточної сторінки в регістрі PCLATH. На етапі трансляції неможливо перевірити коректність передачі управління під час виконання, для цього також потрібне моделювання виконання програми;
  • обмеженість ресурсів МК серії PIC робить проблематичним їх програмування на мовах високого рівня.

Вказані особливості архітектури мікроконтролерів PIC компенсуються надзвичайно низькою ціною, тому такі вироби (особливо сімейства PIC16) вельми популярні. В даний час їх використовують навіть замість логічних ІС. Але реалізувати всі переваги цих МК можна тільки за наявності засобів програмування і відладки, адекватної за ціною і функціональними можливостями вирішуваним задачам. Найважливіші вимоги до інструментальних засобів для МК, орієнтованих на виконання функцій вводу/виводу, можна сформулювати таким чином:

  • основним призначенням цих засобів є підтримка програмування на мові асемблер і перенесення програми на плату системи управління;
  • потужні  драйвери портів вводу/виводу, стан яких однозначно описується значеннями в регістрах управління, спрощують функцію заміщення електрофізичних параметрів прототипної БІС, тому такі порти можна імітувати з допомогою БІС програмованої логіки;
вартість інструментальних засобів повинна відповідати невисокій вартості одноплатного контроллера.

 

 

попередня тема наступна тема